3.3 Boxplots mit Plotly#

Die wichtigsten statistischen Kennzahlen lassen sich mit einem Diagramm visualisieren, das Boxplot genannt wird. Selten wird auch der deutsche Begriff Kastendiagramm dafür gebraucht. In diesem Kapitel visualisieren wir nur einen Datensatz. Die große Stärke der Boxplots ist normalerweise, die statistischen Kennzahlen von verschiedenen Datensätzen nebeneinander zu visualisieren, um so leicht einen Vergleich der Datensätze zu ermöglichen.

Lernziele#

Lernziele

  • Sie können Plotly Express mit der typischen Abkürzung px importieren.

  • Sie können mit px.box() einen Boxplot eines Pandas-Series-Objektes visualisieren.

  • Sie können die Beschriftung eines Boxplots verändern. Dazu gehört die die Beschriftung der Achsen und der Titel.

  • Sie können die Datenpunkte neben einem Boxplot anzeigen lassen.

  • Sie wissen, was ein Ausreißer ist und können Ausreißer im Boxplot anzeigen lassen.

Plotly#

Es gibt zahlreiche Python-Module, die zur Visualisierung von Daten geeignet sind. In dieser Vorlesung verwenden wir Plotly. Plotly unterstützt sehr viele verschiedene Diagrammtypen, wie auch das bekannteste Modul zur Erstellung von Diagrammen, die sehr bekannte Python-Bibliothek Matplotlib. Im Gegensatz zu Matplotlib ist Plotly jedoch interaktiv. Zusätzlich bietet Plotly das Module Plotly Express an, das eine einfach zu bedienende Schnittstelle zur Erstellung von Diagrammen zur Verfügung stellt.

Üblicherweise wird Plotly Express als px abgekürzt. Wir importieren das Modul und schauen uns mit der dir()-Funktion an, welche Funktionalitäten Plotly Express bietet.

import plotly.express as px

dir(px)
['Constant',
 'IdentityMap',
 'NO_COLOR',
 'Range',
 '__all__',
 '__builtins__',
 '__cached__',
 '__doc__',
 '__file__',
 '__loader__',
 '__name__',
 '__package__',
 '__path__',
 '__spec__',
 '_chart_types',
 '_core',
 '_doc',
 '_imshow',
 '_special_inputs',
 'area',
 'bar',
 'bar_polar',
 'box',
 'choropleth',
 'choropleth_map',
 'choropleth_mapbox',
 'colors',
 'data',
 'defaults',
 'density_contour',
 'density_heatmap',
 'density_map',
 'density_mapbox',
 'ecdf',
 'funnel',
 'funnel_area',
 'get_trendline_results',
 'histogram',
 'icicle',
 'imshow',
 'imshow_utils',
 'line',
 'line_3d',
 'line_geo',
 'line_map',
 'line_mapbox',
 'line_polar',
 'line_ternary',
 'optional_imports',
 'parallel_categories',
 'parallel_coordinates',
 'pd',
 'pie',
 'scatter',
 'scatter_3d',
 'scatter_geo',
 'scatter_map',
 'scatter_mapbox',
 'scatter_matrix',
 'scatter_polar',
 'scatter_ternary',
 'set_mapbox_access_token',
 'strip',
 'sunburst',
 'timeline',
 'treemap',
 'trendline_functions',
 'violin']

Boxplots mit Plotly Express#

Wir greifen erneut unser Autoscout24-Beispiel mit den 10 Autos auf.

import pandas as pd

preisliste = [1999, 35990, 17850, 46830, 27443, 14240, 19950, 15950, 21990, 12450]
preise = pd.Series(preisliste, index = ['Audi Nr. 1', 'Audi Nr. 2', 'Audi Nr. 3', 'BMW Nr. 1', 'BMW Nr. 2', 
    'Citroen Nr. 1', 'Citroen Nr. 2', 'Citroen Nr. 3', 'Citroen Nr. 4', 'Citroen Nr. 5'])

print(preise)
Audi Nr. 1        1999
Audi Nr. 2       35990
Audi Nr. 3       17850
BMW Nr. 1        46830
BMW Nr. 2        27443
Citroen Nr. 1    14240
Citroen Nr. 2    19950
Citroen Nr. 3    15950
Citroen Nr. 4    21990
Citroen Nr. 5    12450
dtype: int64

Um einen Boxplot zu erstellen, nutzen wir die Funktion box() von Plotly Express. Wir speichern das Diagramm, das durch diese Funktion erstellt wird, in der Variablen diagramm. Um es dann auch nach seiner Erzeugung tatsächlich anzeigen zu lassen, verwenden wir die Methode .show(). Zusammen sieht der Python-Code zur Erzeugung eines Boxplots folgendermaßen aus:

diagramm = px.box(preise)
diagramm.show()

Bewegen wir die Maus über dem Diagramm, so sehen wir die interaktiven Möglichkeiten. Damit die Zahlen besser ablesbar sind, werden sie eingeblendet, sobald wir mit dem Mauszeiger über der Box sind. Auch erscheinen rechts oben weitere Einstellmöglichkeiten.

Die untere Antenne zeigt das Minimum an, die obere Antenne das Maximum der Daten. Der Kasten, also die Box, wird durch das untere unteren Q1 und das obere Quartil Q3 begrenzt. Oder anders formuliert liegen 50 % aller auftretenden Elemente in der Box. Der Median wird durch die Linie in der Box dargestellt.

Das folgende Video erklärt, wie der Boxplot zu interpretieren ist.

Video zu “Boxplot” von Datatab

Beschriftung des Boxplots verändern#

Die Achsenbeschriftungen wurden automatisch gesetzt. Die x-Achse ist mit ‘variable’ und die y-Achse mit ‘value’ beschriftet. Darüber hinaus ist der Titel der Box ‘0’. Das wird auch angezeigt, wenn die Maus sich über die Box bewegt.

Die 0 wird angezeigt, weil das Pandas-Series-Objekt ‘preise’ für den Boxplot als Tabelle interpretiert wird und die erste Spalte den Index 0 hat. Wir können der Spalte aber auch einen eigenen Namen geben. Am einfachsten klappt das direkt bei der Erzeugung, indem der Parameter name= gesetzt wird.

preisliste = [1999, 35990, 17850, 46830, 27443, 14240, 19950, 15950, 21990, 12450]
preise_mit_name = pd.Series(preisliste, index = ['Audi Nr. 1', 'Audi Nr. 2', 'Audi Nr. 3', 'BMW Nr. 1', 'BMW Nr. 2', 
    'Citroen Nr. 1', 'Citroen Nr. 2', 'Citroen Nr. 3', 'Citroen Nr. 4', 'Citroen Nr. 5'],
    name='XXS-Liste von Autoscout24')

print(preise_mit_name)
Audi Nr. 1        1999
Audi Nr. 2       35990
Audi Nr. 3       17850
BMW Nr. 1        46830
BMW Nr. 2        27443
Citroen Nr. 1    14240
Citroen Nr. 2    19950
Citroen Nr. 3    15950
Citroen Nr. 4    21990
Citroen Nr. 5    12450
Name: XXS-Liste von Autoscout24, dtype: int64

Der neue Name ‘XXS-Liste von Autoscout24’ wird zusätzlich zur Information ‘dtype’ angezeigt. Damit sieht der Boxplot folgendermaßen aus:

diagramm = px.box(preise_mit_name)
diagramm.show()

Sollen nun auch noch die Achsenbeschriftungen geändert werden, müssen wir die automatisch gesetzten Beschriftungen durch neue Namen ersetzt werden. Eingeleitet wird die Ersetzung durch das Schlüsselwort labels=. Danach steht in geschweiften Klammern { und } der alten Name, dann folgt ein Doppelpunkt und dann der neue Name.

diagramm = px.box(preise_mit_name, labels={'variable': 'Name des Datensatzes'})
diagramm.show()

Sollen gleich mehrere Beschriftungen ersetzt werden, werden alle Paare mit einem Komma getrennt aufgelistet.

diagramm = px.box(preise_mit_name, labels={'variable': 'Name des Datensatzes', 'value': 'Verkaufspreis [EUR]'})
diagramm.show()

Fehlt noch eine Überschrift, ein Titel. Wie das englische Wort ‘title’ heißt auch das entsprechende Schlüsselwort zum Erzeugen eines Titels, nämlich title=.

diagramm = px.box(preise_mit_name, 
              labels={'variable': 'Name des Datensatzes', 'value': 'Verkaufspreis [EUR]'},
              title='Statistische Kennzahlen als Boxplot')
diagramm.show()

Datenpunkte im Boxplot anzeigen#

Oft ist es wünschenswert die Rohdaten zusammen mit dem Boxplot zu visualisieren. Das ist mit dem points=-Parameter recht einfach, jedoch haben wir zwei mögliche Optionen. Wir können mit 'all' alle Punkte anzeigen lassen oder nur die Ausreißer ('outliers').

Lassen wir zuerst alle Punkte anzeigen und setzen also points='all'.

diagramm = px.box(preise_mit_name, 
              labels={'variable': 'Name des Datensatzes', 'value': 'Verkaufspreis [EUR]'},
              points='all')
diagramm.show()

Die Punkte werden links vom Boxplot platziert. Als nächstes lassen wir uns die Ausreißer anzeigen.

diagramm = px.box(preise_mit_name, 
              labels={'variable': 'Name des Datensatzes', 'value': 'Verkaufspreis [EUR]'},
              points='outliers')
diagramm.show()

Es sind keine Punkte zu sehen, was ist falsch? Nun, um das zu klären, müssen wir erst einmal definieren, was ein Ausreißer ist.

Ausreißer berechnen und visualisieren#

Die Box im Boxplot enthält 50 % aller Datenpunkte, denn sie ist durch das untere Quartil Q1 und das obere Quartil Q3 begrenzt. Die Differenz zwischen Q1 und Q3 wird Interquartilsabstand (manchmal auch kurz Quartilsabstand) genannt und mit IQR (englisch für Interquartile Range) abgekürzt. In der Statistik werden Punkte, die kleiner als Q1 - 1.5 IQR oder Punkte, die größer als Q3 + 1.5 IQR sind, als Ausreißer angesehen. Im Beispiel des XXS-Datensatzes der Autopreise kommen keine Ausreißer vor, weil Minimum und Maximum noch innerhalb dieses Bereichs liegen. Wir fügen daher noch ein neues, teureres Auto ein. Jetzt sehen wir einen Ausreißer.

preise_mit_name['BMW Nr. 3'] = 62999
diagramm = px.box(preise_mit_name, 
              labels={'variable': 'Name des Datensatzes', 'value': 'Verkaufspreis [EUR]'},
              points='outliers')
diagramm.show()

Zusammenfassung und Ausblick#

Der Boxplot ermöglicht eine einfache Visualisierung der wichtigsten statistischen Kennzahlen eines Datensatzes. Seine Stärke spielt er aus, sobald mehrere Datensätze miteinander verglichen werden sollen. Daher werden wir im nächsten Kapitel uns mit Tabellen beschäftigen.